package com.mx.plantillador;

import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CreadoraObjetosDinamicos {

	public static void main(String[] args) throws Exception {

		

		
		Map<String, Class<?>> propiedades = new HashMap<String, Class<?>>();
		propiedades.put("campoTabla1", String.class);
		propiedades.put("campoTabla2", String.class);
		propiedades.put("campoTabla3", String.class);
		
		Class<?> clazzTabla1 = PojoGenerator.generate("mx.gob.siat.sat.Tabla1", propiedades);
		
		List lstTabla1 = new ArrayList();
		
		for(int i=0;i<10;i++){
			Object objTabla1 = clazzTabla1.newInstance();
			clazzTabla1.getMethod("setCampoTabla1", String.class).invoke(objTabla1, "valorc1");
			clazzTabla1.getMethod("setCampoTabla2", String.class).invoke(objTabla1, "valorc2");
			clazzTabla1.getMethod("setCampoTabla3", String.class).invoke(objTabla1, "valorc3");
			lstTabla1.add(objTabla1);
		}

		
		
		
		
		
		
		Map<String, Class<?>> propsReporte = new HashMap<String, Class<?>>();
		propsReporte.put("campo1", String.class);
		propsReporte.put("campo2", String.class);
		propsReporte.put("campo3", String.class);
		propsReporte.put("campo4", String.class);
		
		propsReporte.put("lstTabla1", List.class);
		
		
		

		Class<?> clazz = PojoGenerator.generate("mx.gob.siat.sat.Reporte", propsReporte);
		
		
		
		

		Object obj = clazz.newInstance();

		System.out.println("Clazz: " + clazz);
		System.out.println("Object: " + obj);
		System.out.println("Serializable? " + (obj instanceof Serializable));

		for (final Method method : clazz.getDeclaredMethods()) {
			System.out.println(method + " "+method.getName());
		}

		// set property "bar"
		clazz.getMethod("setCampo1", String.class).invoke(obj, "Hello World!");
		clazz.getMethod("setCampo2", String.class).invoke(obj, "Hello World!");
		clazz.getMethod("setCampo3", String.class).invoke(obj, "Hello World!");
		clazz.getMethod("setCampo4", String.class).invoke(obj, "Hello World!");
		clazz.getMethod("setLstTabla1", List.class).invoke(obj, lstTabla1);
		

		// get property "bar"
		String result1 = (String) clazz.getMethod("getCampo1").invoke(obj);
		String result2 = (String) clazz.getMethod("getCampo2").invoke(obj);
		String result3 = (String) clazz.getMethod("getCampo3").invoke(obj);
		String result4 = (String) clazz.getMethod("getCampo4").invoke(obj);
		List result5 = (List) clazz.getMethod("getLstTabla1").invoke(obj);
		
		System.out.println("Value for campo1: " + result1);
		System.out.println("Value for campo2: " + result2);
		System.out.println("Value for campo3: " + result3);
		System.out.println("Value for campo4: " + result4);
		//System.out.println("Value for campo5: " + (String) clazz.getMethod("getCampoTabla1").invoke(result5.get(1)));
		
		for(int i=0;i<10;i++){
			//System.out.println(result5.get(i).getClass());
			String resulta=(String) clazzTabla1.getMethod("getCampoTabla1").invoke(result5.get(i).getClass());
			System.out.println(resulta);
		}
		
	}

}
